#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>
#include<unistd.h>
#include<fcntl.h>
using namespace std;
//阻塞式IO
//int main()
//{
//	while (true)
//	{
//		char buffer[1024];
//		ssize_t s = read(0, buffer, sizeof(buffer) - 1);
//		if (s > 0)
//		{
//			buffer[s] = 0;
//			cout << "echo#" << buffer << endl;
//		}
//		else if (s == 0)
//		{
//			cout << "end stdin" << endl;
//			break;
//		}
//		else
//		{
//			//读取错误
//		}
//	}
//}
//非阻塞式IO
void SetNoBlock(int fd)
{
	int fl = fcntl(fd, F_GETEL);
	if (fl < 0)
	{
		cerr << "fcntl error" << endl;
		exit(0);
	}
	fcntl(fd, F_SETFL, fl | O_NONBLOCK);
}

int main()
{
	SetNoBlock(0);
	while (true)
	{
		char buffer[1024];
		ssize_t s = read(0, buffer, sizeof(buffer) - 1);
		if (s > 0)
		{
			buffer[s] = 0;
			cout << "echo#" << buffer << endl;
		}
		else if (s == 0)
		{
			cout << "end stdin" << endl;
			break;
		}
		else
		{
			//非阻塞等待，如果数据没有准备好，返回值会按照出错返回 
			//s==-1 ,靠返回值，无法区分是读取错误/还是数据没有准备好
			//EAGAIN 11  EINTR(也不算错误)
			if (errno == EWOULDBLOCK || errno == EAGAIN)
			{
				cout << "OS数据底层还没有就绪，errno：" << errno << endl;
				//做其他事情
			}
			else if (errno == EINTR)
			{
				cout << "IO被中断了" << endl;
			}
			else
			{
				cout << "read error!" << endl;
			}
		}
		sleep(1);
	}
}